// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.mall.score;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;

import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.Processor;
import com.eva.framework.dbpool.DBDepend;
import com.eva.framework.dbpool.DBShell;
import com.eva.framework.dto.SysActionConst;
import com.eva.framework.utils.EndsExceptionFactory;
import com.x52im.mall.score.dto.TokenRechangeHistory;

/**
 * 积分管理功能集业务处理器.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class ScoreProcessor implements SysActionConst, Processor
{
	private static DBShell db = new DBShell();

	/**
	 * 处理器的核心实现方法.<br>
	 * 可据job_dispatch_id找到对应的JobDispatcher，JobDispatcher又能据
	 * action_id进行对应动作的处理，以完成本次操作请求.
	 * 
	 * @param job_dispatch_id
	 *            作业调度ID
	 * @param action_id
	 *            动作ID
	 * @param Object
	 *            newData 客端发送过来的本次修改新数据(可能为空，理论上与oldData不会同时空）
	 * @param Object
	 *            oldData 客端发送过来的本次修改前的老数据(可能为空，理论上与newData不会同时空）
	 * @param UserRoot
	 *            user 包含该请求用户完整个人信息封装对象（该对象来自于成功登陆后存放于session中的值）
	 * @return 任意类型返回值
	 * @throws Exception
	 */
	@Override
	public Object process(int job_dispatch_id, int action_id, Object newData, Object oldData, User user) throws Exception
	{
		Object ret = null;
		switch (job_dispatch_id)
		{
		case com.x52im.mall.score.dto.JobDispatchConst.SCORE_RECHARGE_ETC:
			ret = scoreJobDispatcher(action_id, newData, oldData, user);
			break;
//		case com.cngeeker.common.mall.score.dto.JobDispatchConst.SCORE_LOTTERY_ETC:
//			ret = scoreLotteryJobDispatcher(action_id, newData, oldData, user);
//			break;
		default:
			throw EndsExceptionFactory.INVALID_JOB_DISPATCHER_ID(job_dispatch_id);
		}
		return ret;
	}

	/**
	 * 维护取件记录相关操作的作业调度.
	 * 
	 * @param action_id
	 *            维护类型，SysConstant中的操作类型常量
	 * @param newData
	 *            客端发送过来的本次修改新数据(可能为空，理论上与oldData不会同时空）
	 * @param oldData
	 *            客端发送过来的本次修改前的老数据(可能为空，理论上与newData不会同时空）
	 * @param userName
	 *            操作者的用户名
	 * @return 返回给客户端的对象
	 */
	public Object scoreJobDispatcher(int action_id, Object newData, Object oldData, User u) throws Exception
	{
		Vector sqls = new Vector(2);
		Vector values = new Vector(2);
		switch (action_id)
		{
		// 执行充值
		case ACTION_NEW:
		{
			TokenRechangeHistory history = (TokenRechangeHistory) newData;
			sqls.add("INSERT INTO token_rechange_history(user_uid,history_date" +
					",pay_type,history_currency,history_amount" +
					",history_token,pay_key,appender,create_time)"
					+ "VALUES(?,?,?,?,?,?,?,?,"+DBDepend.getDefaultDatetimeFunc()+")");
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			values.add(new Object[] { history.getUser_uid(), sdf.format(date), history.getPay_type(), history.getHistory_currency(),
					history.getHistory_amount(), history.getHistory_token(), history.getPay_key(), CommonUtils.isStringEmpty(history.getAppender()) ? u.getIp() : history.getAppender()});
			/**
			 * CommonUtils.isStringEmpty(history.getAppender()) ? u.getIp() : history.getAppender()
			 * 当是抽奖充值时history.getAppender()为空，存入IP，否则正常存入客户端值
			 */

			boolean res = db.update(sqls, values, true);
			return res ? history.getPay_key() : null;
		}
		// 查询充值历史记录
		case ACTION_QUERY:
		{
			String sql = "SELECT record_id,user_uid,history_date,pay_type,history_currency" +
					",history_amount,history_token,create_time,pay_key" +
					",appender FROM token_rechange_history WHERE user_uid = '"
					+ newData+"' order by create_time desc";
			Vector<Vector> vec = db.queryData(sql);
			ArrayList<TokenRechangeHistory> datas = new ArrayList<TokenRechangeHistory>();
			if(vec.size() > 0)
			{
				for(Vector row : vec)
				{
					int j = 0;
					TokenRechangeHistory h = new TokenRechangeHistory();
					h.setRecord_id((String)row.get(j++));
					h.setUser_uid((String)row.get(j++));
					h.setHistory_date((String)row.get(j++));
					h.setPay_type((String)row.get(j++));
					h.setHistory_currency((String)row.get(j++));
					h.setHistory_amount((String)row.get(j++));
					h.setHistory_token((String)row.get(j++));
					h.setCreate_time((String)row.get(j++));
					h.setPay_key((String)row.get(j++));
					h.setAppender((String)row.get(j++));
					
					datas.add(h);
				}
			}
			return datas;
		}
		// 查询个人积分
		case ACTION_APPEND1:
		{
			String sql = "SELECT * FROM token_user_token WHERE user_uid = '" + (Integer) newData + "'";
			return db.querySingleItem(sql);
		}
//		// ！！本action用来测试客户端与服务端的数据交互哦！！！！！！！！
//		case ACTION_APPEND2:
//		{
//			String dataFromClient = (String) newData;
//			return "您发给我的数据是：\"" + dataFromClient + "\"【" + System.currentTimeMillis() + "】";
//		}
		
		// 查询充值历史记录
		case ACTION_APPEND3:
		{
			// 根据db类型的不同，决定选取前4行结果的sql该怎么写
			boolean isSQLServer = DBShell.isSQLServer();
			boolean isMySQL = DBShell.isMySQL();
			String sql = "SELECT "+(isSQLServer?"top 5":"")+" record_id,user_uid,history_date,pay_type,history_currency" +
					",history_amount,history_token,create_time,pay_key" +
					",appender FROM token_rechange_history WHERE user_uid = '"
					+ newData+"' order by create_time desc "+(isMySQL?"limit 0,5":"");
			
			Vector<Vector> vec = db.queryData(sql);
			ArrayList<TokenRechangeHistory> datas = new ArrayList<TokenRechangeHistory>();
			if(vec.size() > 0)
			{
				for(Vector row : vec)
				{
					int j = 0;
					TokenRechangeHistory h = new TokenRechangeHistory();
					h.setRecord_id((String)row.get(j++));
					h.setUser_uid((String)row.get(j++));
					h.setHistory_date((String)row.get(j++));
					h.setPay_type((String)row.get(j++));
					h.setHistory_currency((String)row.get(j++));
					h.setHistory_amount((String)row.get(j++));
					h.setHistory_token((String)row.get(j++));
					h.setCreate_time((String)row.get(j++));
					h.setPay_key((String)row.get(j++));
					h.setAppender((String)row.get(j++));
					
					datas.add(h);
				}
			}
			return datas;
		}

		default:
			throw EndsExceptionFactory.INVALID_ACTION_ID(action_id);
		}
	}
	
	
//	/**
//	 * 维护积分抽奖
//	 */
//	public Object scoreLotteryJobDispatcher(int action_id, Object newData, Object oldData, User u) throws Exception
//	{
//		Vector sqls = new Vector(2);
//		Vector values = new Vector(2);
//		switch (action_id)
//		{
//		// 查询奖品客户端展示所用
//		case ACTION_QUERY:
//		{
//			String sql = "SELECT prize_id, prize_name, prize_level, prize_token, prize_count FROM token_lottery_prize " +
//					"WHERE is_valid = 1 order by prize_level asc";
//			Vector<Vector> vec = db.queryData(sql);
//			LinkedList<TokenLotteryPrize> datas = new LinkedList<TokenLotteryPrize>();
//			if(vec.size() > 0)
//			{
//				for(Vector row : vec)
//				{
//					int j = 0;
//					TokenLotteryPrize t = new TokenLotteryPrize();
//					t.setPrize_id((String)row.get(j++));
//					t.setPrize_name((String)row.get(j++));
//					t.setPrize_level(Integer.valueOf((String)row.get(j++)));
//					t.setPrize_token(Integer.valueOf((String)row.get(j++)));
//					t.setPrize_count(Integer.valueOf((String)row.get(j++)));
//					datas.add(t);
//				}
//			}
//			return datas;
//		}
//		// 抽奖结果
//		case ACTION_APPEND1:
//		{
//			String user_uid = (String)newData;
//			String sql = "select prize_id,prize_name,prize_level,prize_token" +
//								",(prize_count - (select count(*) from token_lottery_prize_history b where a.is_valid = 1 and a.prize_id = b.prize_id and datediff(d,b.history_time,getdate()) = 0 )) " +
//						 "from token_lottery_prize a order by a.prize_level asc";
//			Vector<Vector> vec = db.queryData(sql);
//			ArrayList<TokenLotteryPrize> datas = new ArrayList<TokenLotteryPrize>();
//			if(vec.size() > 0)
//			{
//				for(Vector row : vec)
//				{
//					int j = 0;
//					TokenLotteryPrize t = new TokenLotteryPrize();
//					t.setPrize_id((String)row.get(j++));
//					t.setPrize_name((String)row.get(j++));
//					t.setPrize_level(Integer.valueOf((String)row.get(j++)));
//					t.setPrize_token(Integer.valueOf((String)row.get(j++)));
//					t.setPrize_count(Integer.valueOf((String)row.get(j++)));
//					
//					t.setPrize_priority((int)Math.pow(t.getPrize_level(), 3));
//					datas.add(t);
//				}
//			}
//			LotteryGift gg = new LotteryGift();
//			gg.initGifts(datas);
//			TokenLotteryPrize gift = gg.getGift();
//			
//			sqls.add("INSERT INTO token_lottery_prize_history(user_uid,prize_id,histroy_amount,history_token,user_ip)"
//					+ "VALUES(?,?,?,?,?)");
//			values.add(new Object[] { user_uid, gift.getPrize_id(), gift.getPrize_token() * TokenRechangeHistory.SCORE_DOLLAR_SCALE, gift.getPrize_token(), u.getIp()});
//
//			return db.update(sqls, values, false) ? gift : null;
//		}
//		default:
//			throw EndsExceptionFactory.INVALID_ACTION_ID(action_id);
//		}
//	}
	
}
